home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / DeliTracker130 / Developer / Developer.run / Programmierung.dok < prev    next >
Encoding:
Text File  |  1992-09-26  |  17.6 KB  |  542 lines

  1. ***************************************************************************
  2. *                     Wie schreibt man externe Player?                    *
  3. ***************************************************************************
  4.  
  5.                             © 1992 by Delirium
  6.                              Datum 12.09.1992
  7.  
  8.  
  9.  
  10. Das externe Player Konzept
  11.  
  12. DeliTracker unterstützt sog. externe Player. Das sind Player, die in einem
  13. speziellen Format vorliegen und von DeliTracker nachgeladen werden können.
  14. Ist ein solcher Player geladen worden, erkennt und spielt DeliTracker die
  15. Module, die von diesem Player unterstützt werden. Derzeit kann DeliTracker
  16. maximal 64 externe Player nachladen. Dies sollte jedoch erst mal für eine
  17. Weile reichen.
  18.  
  19. Beim Start von DeliTracker werden alle Player, die sich im Verzeichnis
  20. 'DeliPlayers' (b.z.w im Configfile gespeicherten Playerpfad) befinden,
  21. geladen. Zusätzlich haben Sie jederzeit die Möglichkeit einen weiteren
  22. bzw. neueren Player nachzuladen. Diese Player verleihen DeliTracker
  23. seine ungeahnte Flexibilität.
  24.  
  25. Externe Player sind Executables, d.h. sie werden reloziert. Am Anfang
  26. besitzen sie die charakteristische Playerstruktur. Sie wird mit dem Macro
  27. aus dem Includefile 'misc/deliplayer.i' erzeugt.
  28.  
  29. Es ist relativ einfach, eine Replayroutine an DeliTracker anzupassen.
  30. Das 'einzige' was Sie tun müssen ist ein wenig Interfacecode zu schreiben.
  31. Dies ist aber halb so wild, denn DeliTracker stellt ihnen viele hilfreiche
  32. Routinen zur Verfügung.
  33.  
  34.  
  35. 1. Grundvoraussetzungen
  36.  
  37. Um ein neues Soundsystem anzupassen, benötigen Sie zum einen den Sourcecode
  38. oder ein linkbares Objektfile der Replayroutine, zum anderen mindestens ca.
  39. 5 Module zum testen der Funktionstüchtigkeit des Players.
  40.  
  41.  
  42. 2. Schematischer Aufbau eines externen Players
  43.  
  44. {
  45.     Playerheader
  46.  
  47.     TagArray
  48.  
  49.     Interfacecode
  50.  
  51.     Replaycode+Daten
  52. }
  53.  
  54.  
  55. 3. Funktionen, die der externe Player zur Verfügung stellt
  56.  
  57. Das PLAYERHEADER Macro generiert den Header, der das File als externen
  58. Player identifiziert. Dieses Macro muß angegeben werden und ganz am
  59. Anfang des Players stehen. Als einziger Parameter ist ein Pointer auf ein
  60. Tag Array einzutragen, in dem alle Funktionen stehen, die der Player
  61. DeliTracker zur Verfügung stellt. Bei allen Funktionsaufrufen außer der
  62. Interruptroutine (DTP_Interrupt) enthält a5 die Base. Globale Variablen
  63. können dadurch adressiert werden. (Siehe auch 'misc/deliplayer.i'). Da
  64. DeliTracker vor Aufruf einer Playerroutine (außer bei DTP_Interrupt) alle
  65. Register sichert, dürfen diese verändert werden.
  66.  
  67.  
  68. PLAYERHEADER <tagarray>
  69.  
  70.     tagarray    Pointer auf ein Tag Array, das mit TAG_DONE
  71.             abgeschlossen sein muß. Tags, bei denen ti_Data NULL
  72.             ist, werden ignoriert.
  73.             Außerdem können folgende SystemTags verwendet werden:
  74.               TAG_DONE
  75.               TAG_IGNORE
  76.               TAG_MORE
  77.               TAG_SKIP
  78.  
  79.  
  80. Derzeit existieren folgende Tags:
  81.  
  82. DTP_CustomPlayer    dieser Tag deklariert einen Player als Customplayer
  83.             ti_Data darf nicht NULL sein !
  84.  
  85. DTP_RequestDTVersion    damit kann man sicherstellen, daß mindestens eine
  86.             bestimmte Version von DeliTracker vorhanden ist.
  87.             Dieser Tag muß angegeben werden, wenn bei den
  88.             DeliTrackerGlobals neue Funktionspointer hinzugekommen
  89.             sind und diese vom Player benutzt werden. ti_Data ist
  90.             dabei die Playerrevision.
  91.  
  92. DTP_RequestV37        wenn dieser Tag vorhanden ist, wird der Player nur
  93.             noch von der Kick 2.0 Version von DeliTracker geladen.
  94.             (d.h. dtg_GadToolsBase ist gültig)
  95.  
  96. DTP_PlayerVersion    Tag, der die Revisionsnummer des Players enthält.
  97.             Bei zwei Playern mit dem gleichen Playernamen wird
  98.             derjenige mit der größeren Revisionsnummer geladen.
  99.  
  100. DTP_PlayerName        ti_Data enthält den Pointer auf den Namen des Players.
  101.             Dieser String kann zwar beliebig lang sein aber zur
  102.             Zeit werden nur die ersten 24 Zeichen angezeigt.
  103.             Dieser Tag muß existieren !
  104.  
  105. DTP_Creator        Pointer auf den Namen des Autors. Dieser wird im Setup-
  106.             fenster im Playerinfofeld angezeigt. Dieser String kann
  107.             $A als Zeilenumbruch enthalten.
  108.  
  109. DTP_Check1        Pointer auf eine Modulerkennungsroutine, die aufgerufen
  110.             wird, wenn 1024 Bytes des Moduls geladen sind. Wird das
  111.             Modul erkannt, liefert sie d0=0, ansonsten d0<>0. 
  112.  
  113. DTP_Check2        Pointer auf eine Modulerkennungsroutine, die aufgerufen
  114.             wird, wenn das komplette Modul geladen und evtl. entpackt
  115.             ist. Wird das Modul erkannt, liefert sie d0=0, ansonsten
  116.             d0<>0.
  117.  
  118. DTP_ExtLoad        Pointer auf eine optionale Laderoutine für Module. Ist
  119.             kein Fehler aufgetreten, wird d0=0 zurückgegeben, sonst
  120.             d0<>0. Hinweis: Achten Sie darauf, daß im Fehlerfall alle
  121.             allocierten Ressourcen (Memory, Locks, ...) wieder frei-
  122.             gegeben werden, da dann keine weiteren Playerfunktionen
  123.             mehr angesprungen werden.
  124.  
  125. DTP_Interrupt        Pointer auf eine Interruptroutine, die mittels eines
  126.             Timerinterrupts standardmäßig alle 1/50 sec aufgerufen
  127.             wird. Dies ist die Standardmethode, um mit der richtigen
  128.             Abspielgeschwindigkeit auf im PAL/NTSC/Productivity
  129.             Videomodus zu spielen. Wenn keine DTP_faster/DTP_slower
  130.             Tags angegeben sind, übernimmt DeliTracker dies durch
  131.             Verändern der Interruptfrequenz. Dieser Tag kann auch
  132.             nicht existieren, dann müssen aber DTP_StartInt/DTP_StopInt
  133.             vorhanden sein !
  134.  
  135. DTP_Stop        Pointer auf eine optionale Stoproutine. Wenn dieser Tag
  136.             nicht vorhanden ist, verfährt DeliTracker folgendermaßen:
  137.                 Interrupt stoppen (DTP_StopInt)
  138.                 Sound Cleanup (DTP_EndSnd)
  139.                 Song initialisieren (DTP_InitSnd)
  140.             Ansonsten hat diese Routine die Aufgabe, einen evtl.
  141.             spielenden Song anzuhalten und so zu initialisieren, daß
  142.             dieser beim nächsten Starten des Interrupts von    Anfang an
  143.             zu spielen beginnt.
  144.  
  145. DTP_Config        Pointer auf eine optionale Initialisierungsroutine. Diese
  146.             wird nur einmal unmittelbar nach dem Laden des Players
  147.             aufgerufen. Mögliche Anwendungen: Laden einer player-
  148.             spezifischen Konfigurationsdatei. 
  149.  
  150. DTP_UserConfig        Pointer auf eine optionale Initialisierungsroutine. Diese
  151.             wird nur dann aufgerufen, wenn der User den Player im
  152.             Setupfenster anwählt und das 'Config' Gadget drückt.
  153.             Mögliche Anwendungen: Öffnen eines Fensters zum Setzen
  154.             weiterer Optionen (Instrumentenpfad, ...) und abspeichern
  155.             einer playerspezifischen Konfigurationsdatei.
  156.  
  157. DTP_SubSongRange    Dieser Tag sollte angegeben werden, wenn der Player Multi-
  158.             Module unterstützt. ti_Data zeigt dabei auf eine Routine,
  159.             die als Returnwert in d0 die minimale und in d1 die maximale
  160.             Subsongnummer zurückgeben muß.
  161.  
  162. DTP_InitPlayer        Pointer auf eine optionale Initialsierungsroutine, die
  163.             aufgerufen wird, wenn ein Modul erfolgreich geladen wurde.
  164.             Tritt kein Fehler auf, liefert sie d0=0, ansonsten d0<>0.
  165.             Hier muß die Allocation der Audiokanäle stattfinden !
  166.             (DeliTracker stellt dafür eine eigene Routine zur Verfügung)
  167.             Falls der Player Multi-Module unterstützt, muß hier
  168.             dtg_SndNum(a5) auf die erste Subsongnummer gesetzt werden.
  169.             Falls eine Routine für DTP_SubSongRange existiert, macht
  170.             DeliTracker das automatisch (d.h. die Initialisierung von
  171.             dtg_SndNum(a5) kann weggelassen werden).
  172.  
  173. DTP_EndPlayer        Pointer auf eine optionale Cleanuproutine, die aufgerufen
  174.             wird, wenn das Modul aus dem Speicher entfernt wird. Hier
  175.             muß die Freigabe der Audiokanäle stattfinden ! (DeliTracker
  176.             stellt dafür eine eigene Routine zur Verfügung)
  177.  
  178. DTP_InitSound        Pointer auf eine optionale Initialsierungsroutine.
  179.             Diese muß das Modul initialisieren, so daß beim Starten
  180.             des Interrupts der Song von Anfang an zu spielen beginnt.
  181.  
  182. DTP_EndSound        Pointer auf eine optionale Cleanuproutine.
  183.             Diese kann z.B. die Lautstärkeregister und die Audio-DMA
  184.             rücksetzen.
  185.  
  186. DTP_StartInt        Pointer auf eine Initialsierungsroutine, die existieren
  187.             muß, wenn DTP_Interrupt nicht vorhanden ist. In diesem
  188.             Fall muß hier der Sound gestartet werden.
  189.  
  190. DTP_StopInt        Pointer auf eine Cleanuproutine, die existieren muß,
  191.             wenn DTP_Interrupt nicht vorhanden ist. In diesem Fall
  192.             muß hier der Sound gestoppt werden.
  193.  
  194. DTP_Volume        Pointer auf eine Funktion, die die Lautstärke neu setzt.
  195.             Die Funktion wird aufgerufen, wenn die Volume neu gesetzt
  196.             wird (Slider, ARexx-Kommando) und beim Initialisieren des
  197.             Moduls vor DTP_InitSnd. Die Mastervolume steht in
  198.             dtg_SndVol(a5). Die Mastervolume ist dabei der maximale 
  199.             Volumewert. Die effektive Volume errechnet sich also
  200.             durch: VOL_eff = ( ( dtg_Volume(a5) * modulevolume ) >> 6 )
  201.             Näheres siehe Beispielsourcen.
  202.  
  203. DTP_Balance        Pointer auf eine Funktion, die die Balance neu setzt.
  204.             Die Funktion wird aufgerufen, wenn die Balance neu gesetzt
  205.             wird (Slider, ARexx-Kommando) und beim Initialisieren des
  206.             Moduls vor DTP_InitSnd. Die Balance für die linken Kanäle
  207.             steht in dtg_SndLBal(a5), für die rechten Kanäle in
  208.             dtg_SndRBal(a5). Hinweis: Alle Player die Balance unterstützen
  209.             können auch Volume ! Man verwendet dann die gleiche Routine 
  210.             zum setzen der Volume&Balance. Die linke Volume errechnet
  211.             sich wie folgt: ( ( dtg_Volume(a5) * dtg_SndLBal(a5) ) >> 6 )
  212.             Entsprechendes gilt für rechts.
  213.  
  214. DTP_Faster        Pointer auf eine Funktion, die den Abspielvorgang
  215.             beschleunigt.
  216.  
  217. DTP_Slower        Pointer auf eine Funktion, die den Abspielvorgang
  218.             verlangsamt.
  219.  
  220. DTP_NextPatt        Pointer auf eine Funktion, die den Patternzeiger
  221.             um eins erhöht.
  222.  
  223. DTP_PrevPatt        Pointer auf eine Funktion, die den Patternzeiger
  224.             um eins erniedrigt.
  225.  
  226. DTP_NextSong        Pointer auf eine Funktion, die Subsongnummer auf den
  227.             nächsten Subsong setzt und diesen spielt.
  228.             (Falls vorhanden)
  229.  
  230. DTP_PrevSong        Pointer auf eine Funktion, die Subsongnummer auf den
  231.             vorhergehenden Subsong setzt und diesen spielt.
  232.             (Falls vorhanden)
  233.  
  234.  
  235.  
  236. 4. Funktionen, die DeliTracker dem externen Player zur Verfügung stellt
  237.  
  238. Eine Funktion wird wie folgt aufgerufen:
  239.  
  240.     move.l    dtg_XXX(a5),a0
  241.     jsr    (a0)
  242.  
  243. Alle folgenden Funktionen außer dtg_SongEnd verwenden d0/d1/a0/a1 als
  244. Scratchregister. In a5 muß bei allen Aufrufen (außer dtg_SongEnd) die
  245. Base stehen.
  246.  
  247. Derzeit existieren folgende Funktionen:
  248.  
  249. dtg_GetListData
  250.  
  251.     SYNOPSIS
  252.         memory size = dtg_GetListData(number)
  253.             a0     d0                     d0.l
  254.  
  255.     FUNCTION
  256.         Liefert Adresse und Länge eines mit LoadFile() geladenen Files.
  257.  
  258.     INPUTS
  259.         number - Nummer eines Files beginnend mit 0 für das vom User
  260.         selektierte File.
  261.  
  262.     RESULT
  263.         memory - ein Pointer auf die Startadresse des Files im Speicher
  264.              oder NULL im Fehlerfall.
  265.         size - Länge des Files in Bytes bzw. 0 im Fehlerfall.
  266.  
  267.  
  268. dtg_LoadFile
  269.  
  270.     SYNOPSIS
  271.         success = dtg_LoadFile(name)
  272.  
  273.     FUNCTION
  274.         Lädt und entpackt ggf. das angegebene File ins Chip-Memory.
  275.         (Hinweis: diese Funktion ergänzt automatisch, falls das File
  276.          mit dem angegebenen Namen nicht geöffnet werden konnte '.pp')
  277.  
  278.     INPUTS
  279.         name - der Filename steht in einem internen Buffer (seine
  280.                Adresse steht in dtg_PathArray)
  281.  
  282.     RESULT
  283.         success - alles ok d0.l=0, sonst d0.l<>0.
  284.  
  285.  
  286. dtg_CopyDir
  287.  
  288.     SYNOPSIS
  289.         dtg_CopyDir()
  290.  
  291.     FUNCTION
  292.         Kopiert das Directory des von User angewählten Files an das
  293.         Ende des Strings, auf den dtg_PathArray(a5) zeigt.
  294.  
  295.  
  296. dtg_CopyFile
  297.  
  298.     SYNOPSIS
  299.         dtg_CopyFile()
  300.  
  301.     FUNCTION
  302.         Kopiert den Filenamen des von User angewählten Files an das
  303.         Ende des Strings, auf den dtg_PathArray(a5) zeigt.
  304.  
  305.  
  306. dtg_CopyString
  307.  
  308.     SYNOPSIS
  309.         dtg_CopyString(string)
  310.                            a0
  311.  
  312.     FUNCTION
  313.         Kopiert den String, auf den das Register a0 zeigt, an das
  314.         Ende des Strings, auf den dtg_PathArray(a5) zeigt.
  315.  
  316.     INPUTS
  317.         string - der Pointer auf den anzuhängenden String steht in a0
  318.  
  319.  
  320. dtg_AudioAlloc
  321.  
  322.     SYNOPSIS
  323.         success = dtg_AudioAlloc()
  324.  
  325.     FUNCTION
  326.         Belegt alle Audiokanäle.
  327.  
  328.     RESULT
  329.         success - alles ok d0.l=0, sonst d0.l<>0.
  330.  
  331.  
  332. dtg_AudioFree
  333.  
  334.     SYNOPSIS
  335.         dtg_AudioFree()
  336.  
  337.     FUNCTION
  338.         Gibt die mit dtg_AudioAlloc belegten Audiokanäle wieder frei.
  339.  
  340.  
  341. dtg_StartInt
  342.  
  343.     SYNOPSIS
  344.         dtg_StartInt()
  345.  
  346.     FUNCTION
  347.         Startet den Soundinterrupt. (Falls er nicht schon läuft.)
  348.         Falls DTP_Interrupt existiert, startet DeliTracker einen
  349.         Timerinterrupt, ansonsten wird DTP_StartInt aufgerufen.
  350.  
  351.  
  352. dtg_StopInt
  353.  
  354.     SYNOPSIS
  355.         dtg_StopInt()
  356.  
  357.     FUNCTION
  358.         Stoppt den Soundinterrupt. (Falls er nicht schon angehalten
  359.         ist.) Falls DTP_Interrupt existiert, stoppt DeliTracker seinen
  360.         Timerinterrupt, ansonsten wird DTP_StopInt aufgerufen.
  361.  
  362.  
  363. dtg_SongEnd
  364.  
  365.     SYNOPSIS
  366.         dtg_SongEnd()
  367.  
  368.     FUNCTION
  369.         Signalisiert DeliTracker, daß das Modul einmal komplett
  370.         gespielt wurde. Diese Funktion verändert keine Register
  371.         und darf auch von Interrupts aufgerufen werden.
  372.  
  373.  
  374. dtg_CutSuffix
  375.  
  376.     SYNOPSIS
  377.         dtg_CutSuffix()
  378.  
  379.     FUNCTION
  380.         Entfernt am Ende des Strings, auf den dtg_PathArray(a5) zeigt
  381.         ggf. die Endung '.pp'
  382.  
  383.  
  384.  
  385. 5. Die Modul-Erkennung
  386.  
  387. Damit DeliTracker die einzelnen Module unterscheiden kann, befindet sich in
  388. jedem Player eine Erkennungsroutine, die auf ein zugehöriges Modul testet.
  389. Diese Routine prüft auf Stellen im Modul, die bei allen Modulen eines Players
  390. gleich sind. So z.B. auf 'M.K.' bei Offset $438 im NoiseTracker-Player.
  391. Bei Sound- und NoiseTracker ist nur das Modul abgespeichert, z.B. bei MarkII
  392. hängt vor jedem Modul noch die Replayroutine. Bei so einem Modul müssen Sie
  393. auf signifikante Assemblerbefehle testen. Ein Vergleich auf ein oder zwei
  394. Sprungbefehle, egal ob bra oder jmp, ist hier nicht ausreichend, da bei
  395. vielen Modulen dieses Typs Sprungtabellen am Anfang stehen und der Player
  396. möglicherweise das falsche Modul erkennen könnte, was in den meisten Fällen
  397. zum Absturz führt.
  398. Der Player MUß GENAU EINE Checkroutine verwenden. Daraus ergeben sich zwei
  399. Grundtypen von Playern.
  400.  
  401.  
  402.   1. Typ eins Player - in der Regel etwas komplexer
  403.     Bei ihnen ist die Check1 Funktion implementiert.
  404.   
  405.     Vorteil: Es lassen sich auch Player realisieren, die das Modul selbst nachladen.
  406.     Nachteil: Gepackte Files werden nicht unterstützt.
  407.   
  408.     Dieser Player sollte nur für Härtefälle verwendet werden.
  409.     (z.B: FTM, IFF-8SVX Player, der das Sample während dem Spielen nachlädt, ...)
  410.   
  411.  
  412.   2. Typ zwei Player - die einfachere Variante
  413.     Bei ihnen ist die Check2 Funktion implementiert
  414.  
  415.     Vorteil: Das Modul kann gepackt sein, der Player bemerkt davon nichts.
  416.     Nachteil: Das Modul ist in jedem Fall im Chip-Memory.
  417.  
  418.     Es sollte im Normalfall dieser Playertyp verwendet werden.
  419.  
  420.  
  421. Egal ob Typ eins oder zwei, wenn der Player das Modul erkannt hat, muß er
  422. in d0.l=0 zurückliefern, wenn nicht d0.l<>0.
  423.  
  424.  
  425. 6. Player-Interrupt
  426.  
  427.   Hier gibt es auch grob eine Einteilung in zwei verschiedene Typen.
  428.  
  429.   1. Player die den DeliTracker Interrupt verwenden
  430.     Vorteil: Der Player ist vom Videomodus unabhängig.
  431.              Besitzt automatisch die faster/slower Funktion.
  432.          Kein Aufwand für den Interrupt (Code + Interruptstruktur).
  433.          Ist kompatibel zum serial.device
  434.     Nachteil: Der Interrupt kommt nicht synchron zum VBlank. (Dies führt
  435.           nur in den seltensten Fällen zu Problemen.)
  436.  
  437.   2. Player die ihren eigenen Interrupt erzeugen.
  438.     Vorteil: Es können andere Interruptquellen benutzt werden
  439.          (z.B. AudioIRQ).
  440.     Nachteil: Erhöhter Aufwand, bei VBlank nicht mehr unabhängig vom
  441.           Videomodus.
  442.  
  443.     Wenn ein eigener Timerinterrupt verwendet wird, sollte die CIAB 
  444.     (wg. OS2.0) und die entsprechenden Resourcefunktionen verwendet werden.
  445.     Außerdem ist es sehr sinnvoll die Replayroutine nicht direkt im CIA-B Timer-
  446.     Interrupt abspielen zu lassen, sondern im Timerinterrupt einen Soft Interrupt 
  447.     mittels Cause() zu generieren. In diesem SoftInt kann man dann die eigentliche 
  448.     Replayroutine ablaufen lassen. So hat man den Vorteil, daß man wesentlich 
  449.     kompatibler zum serial.device ist. Dies liegt daran, daß SoftInt eine 
  450.     niedrigere Priorität als der der RBF (Read Buffer Full) Interrupt hat d.h. 
  451.     erst wird der serielle Port bedient, dann erst die Replayroutine.
  452.     Es wird davor gewarnt, direkt in die Interruptvektoren zu schreiben!
  453.     Zur Erinnerung: vom Betriebssystem werden die Funktionen AddIntServer()
  454.                 und SetIntVector() zur Verfügung gestellt ! 
  455.  
  456.  
  457. 7. Custom Module
  458.  
  459.   Dies sind keine Module im herkömmlichen Sinn, sondern im wesentlichen
  460.   Player, die ein Spezialmodul beinhalten. Mit diesem Format können Sie
  461.   auch die ausgefallensten Module mit DeliTracker abspielen. Sollten für
  462.   den Player jedoch mehrere Module existieren, ist es in dem Fall ratsam,
  463.   einen richtigen Player zu schreiben.
  464.  
  465. Schematischer Aufbau eines Custom Moduls
  466.  
  467. {
  468.     Playerheader
  469.  
  470.     TagArray
  471.  
  472.     Interfacecode
  473.  
  474.     Replaycode+Daten
  475.  
  476.     MODUL
  477. }
  478.  
  479. Mit dem Tag DTP_CustomPlayer wird ein Player als Customplayer deklariert,
  480. folgende Tags sind dann bedeutungslos:
  481.  
  482.     - DTP_PlayerVersion
  483.     - DTP_PlayerName
  484.     - DTP_Creator
  485.     - DTP_Check1
  486.     - DTP_Check2
  487.     - DTP_ExtLoad
  488.     - DTP_Config
  489.     - DTP_UserConfig
  490.  
  491.  
  492. 8. Checkliste
  493.  
  494. Dies ist eine kleine Checkliste für Player/Custommodul Anpassung, die erfüllt
  495. werden muß, damit der Player systemkonform ist und einwandfrei funktioniert.
  496.  
  497.     [ ] ist die Checkroutine präzise genug ?
  498.     [ ] werden die Audiokanäle richtig belegt und freigegeben ?
  499.     [ ] wird aller allocierter Speicher freigegeben ?
  500.     [ ] werden alle Locks wieder freigegeben ?
  501.     [ ] enforcer und mungwall - Test bestanden ?
  502.     [ ] werden alle möglichen Fehler korrekt abgefangen ?
  503.     [ ] wurde der Player mit 1.2, 1.3 und 2.0 getestet ?
  504.     [ ] spielt der Player in allen Videomodi korrekt ?
  505.  
  506.  
  507. 9. Diverses
  508.  
  509. Der Player sollte den Zustand der LED unbeeinflußt lassen, da im Setupwindow
  510. ein entsprechende Funktion existiert.
  511.  
  512.  
  513. Problemecke
  514.  
  515. Symptom        mögliche Ursache            Beseitigung
  516.  
  517. Absturz        a5 überschrieben
  518.         Register nicht gesichert
  519.         falsche oder zu späte Initialisierung    
  520.         Modul zu neu für den Player        präziserer Check
  521.  
  522. klingt schräg    Audiodaten nicht im Chipmem        Player ins Chipmem
  523.         falsche Initialisierung
  524.         Modul zu neu für den Player        präziserer Check
  525.         Player benötigt bestimmte Werte in    zusätzliche Initialisierung
  526.         einigen Registern
  527.         unverträglicher Videomodus
  528.  
  529. kein Ton    Audio-DMA abgeschaltet
  530.  bei >68000    Player schreibt direkt auf        Betriebssystemfuntionen
  531.         Interruptvektoren            benutzen
  532.  
  533. fast keine    fehlerhaftes Interrupt-Handling        bei VBlank-IRQ:
  534. freie CPU-Zeit                        Z-Flag muß am Ende gesetzt sein!
  535.  
  536. lahmes System    68000/020/030 zu langsam        68040 kaufen ;-)
  537.  
  538.  
  539.  
  540.  
  541.  
  542.